package com.air.controller.airline;


import com.air.dto.BaggageDTO;
import com.air.dto.BaggagePageQueryDTO;
import com.air.result.PageResult;
import com.air.result.Result;
import com.air.service.BaggageService;
import com.air.vo.BaggageVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
/**
 * 行李信息服务控制器
 *
 * 提供与行李相关的RESTful API接口，包括查询、添加、更新及删除行李信息等功能。
 * 通过Spring的@RestController注解标记，此控制器类中的所有方法都将直接以JSON格式响应HTTP请求。
 * 请求映射基础路径为/airline/baggage，以便统一管理行李相关的API端点。
 * 使用@Api注解标记，便于Swagger等API文档工具识别并归类接口文档至"行李相关接口"标签下。
 * Slf4j日志框架被注入，以便在控制器中进行日志记录，有助于追踪操作流程及问题排查。
 */
@RestController
@RequestMapping("/airline/baggage")
@Api(tags = "行李相关接口")
@Slf4j
public class BaggageController {
    @Autowired
    private BaggageService baggageService; //自动注入BaggageService实例，用于处理行李相关业务。



    /**
     * 通过POST请求添加行李订单。
     * 该方法接收一个BaggageDTO对象作为请求体，其中包含了行李的相关信息。
     * 调用baggageService的save方法来保存这个行李订单信息。
     * 方法返回一个表示操作结果的Result对象，指示行李订单添加操作是否成功。
     *
     * @param baggageDTO 行李订单的相关信息，包括行李的细节和旅客信息等。
     * @return Result 对象，表示操作是否成功。成功时，返回一个带有成功标识的结果对象。
     */
    @PostMapping
    @ApiOperation("添加行李订单")
    public Result save(@RequestBody BaggageDTO baggageDTO) {
        // 将行李信息保存到系统中
        baggageService.save(baggageDTO);
        // 返回操作成功的提示信息
        return Result.success();

    }


    /**
     * 分页查询行李订单信息。
     * <p>
     * 通过接收BaggagePageQueryDTO对象，查询符合条件的行李订单，并返回分页结果。
     * 此接口提供了对行李订单数据的分页查询能力，支持根据不同的查询条件进行筛选。
     *
     * @param baggagePageQueryDTO 查询条件对象，包含分页信息和过滤条件。
     * @return 返回查询结果的分页对象，其中包含具体的订单信息。
     */
    @PostMapping("/page")
    @ApiOperation("分页查询行李订单")
    public Result<PageResult> pageQuery(BaggagePageQueryDTO baggagePageQueryDTO) {
        // 调用baggageService的pageQuery方法进行分页查询
        PageResult pageResult = baggageService.pageQuery(baggagePageQueryDTO);
        // 将查询结果封装成成功结果并返回
        return Result.success(pageResult);
    }


    /**
     * 批量删除行李订单。
     * 通过@DeleteMapping注解指定该方法处理HTTP DELETE请求，请求的路径为/{ids}，其中{ids}是一个路径变量，代表要删除的行李订单ID列表。
     * 使用@ApiOperation注解来描述该API的操作，此处表示批量删除行李订单。
     *
     * @param ids 要删除的行李订单ID列表，通过路径变量获取。
     * @return 返回操作结果，如果删除成功，则返回一个表示成功的Result对象。
     */
    @DeleteMapping("/{ids}")
    @ApiOperation("批量删除行李订单")
    public Result delete(@PathVariable List<Long> ids) {
        // 调用baggageService的deleteBatch方法，传入要删除的订单ID列表，执行批量删除操作。
        baggageService.deleteBatch(ids);
        // 返回操作成功的结果。
        return Result.success();
    }


    /**
     * 修改行李订单
     * 该方法通过接收一个BaggageDTO对象，更新行李订单的信息。
     * 使用@PutMapping注解指定该方法处理HTTP PUT请求。
     * 使用@ApiOperation注解说明该方法的API操作性质。
     *
     * @param baggageDTO 包含更新后行李订单信息的数据传输对象。
     * @return 返回一个Result对象，表示操作的结果。如果操作成功，返回一个成功的Result对象。
     */
    @PutMapping
    @ApiOperation("修改行李订单")
    public Result update(@RequestBody BaggageDTO baggageDTO) {
        // 调用baggageService的update方法来更新行李订单信息。
        baggageService.update(baggageDTO);
        // 返回一个表示操作成功的Result对象。
        return Result.success();
    }


    /**
     * 根据指定的ID获取行李订单详情。
     * <p>
     * 该接口使用GET方法，并通过URL路径参数传递行李订单ID。
     * 它的目的是为了检索特定行李订单的详细信息。
     * </p>
     * @param id 行李订单的唯一标识符。
     * @return 包含指定行李订单详情的结果对象。如果订单不存在，则可能返回一个空对象或错误代码。
     */
    @GetMapping("/{id}")
    @ApiOperation("根据id查询行李订单")
    public Result<BaggageVO> getById(@PathVariable Long id) {
        // 通过ID从服务层获取行李订单详情
        BaggageVO baggageVO = baggageService.getById(id);
        // 返回查询结果，如果查询成功，则将行李订单详情封装在Result对象中返回
        return Result.success(baggageVO);
    }

    /**
     * 根据航空公司id查询行李订单列表。
     *
     * 此接口提供了一个功能，即通过航空公司的ID来检索相关的行李订单列表。
     * 这对于需要管理或查询特定航空公司下行李订单的场景非常有用。
     *
     * @param id 航空公司的ID，用于过滤行李订单。
     * @return 返回一个包含符合条件的行李订单列表的结果对象。
     */
    /**
     * 根据航空公司id查询行李订单
     */
    @GetMapping("/list")
    @ApiOperation("根据航空公司id查询行李订单")
    public Result<List<BaggageVO>> list(@RequestParam Long id) {
        // 调用baggageService的服务方法，根据提供的航空公司ID查询行李订单列表
        List<BaggageVO> list = baggageService.list(id);
        // 返回查询结果，将其包装在Result对象中，表示操作成功
        return Result.success(list);
    }

}
